// 配置axios请求实例

import { useUserStore } from '@/store';
import { reqRefreshToken } from '@/api/user';

// 基础URL
const BASE_URL = 'https://letaoapi.jxsaichuang.com';

// 请求封装
const request = async (options) => {
  return new Promise(async (resolve, reject) => {
    // 获取用户token
    const userStore = useUserStore();

    // 组装请求配置
    const requestOptions = {
      ...options,
      url: BASE_URL + options.url,
      header: {
        'Content-Type': 'application/json',
        ...options.header,
      },
    };

    // 如果有token，添加到请求头
    if (userStore.token) {
      requestOptions.header.token = userStore.token;
      // console.log('发送请求的header:', JSON.stringify(requestOptions.header));
    }

    // 发起请求
    uni.request({
      ...requestOptions,
      success: async (res) => {
        if (res.statusCode === 200) {
          resolve(res.data);
        } else if (res.statusCode === 401) {
          console.log('收到401响应，准备刷新token');
          // token失效，尝试刷新
          try {
            if (!userStore.refreshToken) {
              console.log('没有refreshToken，直接跳转登录');
              throw new Error('No refresh token available');
            }

            console.log(
              '开始刷新token，使用refreshToken:',
              userStore.refreshToken
            );
            const refreshRes = await reqRefreshToken(userStore.refreshToken);
            console.log('刷新token响应:', refreshRes);

            // 直接使用服务器返回的新token
            userStore.updateToken(refreshRes.token, userStore.refreshToken);
            console.log('获取到新token:', refreshRes.token);

            // 使用新token重试原请求
            const retryOptions = {
              ...requestOptions,
              header: {
                ...requestOptions.header,
                token: refreshRes.token,
              },
            };

            console.log('使用新token重试请求:', JSON.stringify(retryOptions));
            // 重试请求
            uni.request({
              ...retryOptions,
              success: (retryRes) => {
                console.log('重试请求响应:', retryRes);
                if (retryRes.statusCode === 200) {
                  resolve(retryRes.data);
                } else {
                  reject(retryRes);
                }
              },
              fail: (error) => {
                console.log('重试请求失败:', error);
                reject(error);
              },
            });
          } catch (error) {
            console.log('刷新token出错:', error);
            // 刷新token出错，清除用户数据
            userStore.clearUserData();
            uni.showModal({
              title: '提示',
              content: '登录已过期，请重新登录',
              success: (result) => {
                if (result.confirm) {
                  uni.navigateTo({
                    url: '/pages/user_package/login/login',
                  });
                }
              },
            });
            reject(error);
          }
        } else {
          reject(res);
        }
      },
    });
  });
};
export default request;
